package app;

import callback.ScanCallBack;
import callback.impl.FileSave2DB;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import task.DBInit;
import task.FileScanner;
import task.FileSearch;

import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;

/**
 * @Author: yuisama
 * @Date: 2022/6/10 16:32
 * @Description:
 */
public class Controller implements Initializable {

    @FXML
    private GridPane rootPane;

    @FXML
    private TextField searchField;

    @FXML
    private TableView<FileMeta> fileTable;

    @FXML
    private Label srcDirectory;

    private Thread fileScanTask;

    public void initialize(URL location, ResourceBundle resources) {
        // 数据库初始化，建表
        DBInit.init();
        // 添加搜索框监听器，内容改变时执行监听事件
        searchField.textProperty().addListener(new ChangeListener<String>() {
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                freshTable();
            }
        });
    }

    public void choose(Event event) {
        // 选择文件目录
        DirectoryChooser directoryChooser = new DirectoryChooser();
        Window window = rootPane.getScene().getWindow();
        File file = directoryChooser.showDialog(window);
        if(file == null)
            return;
        // 获取选择的目录路径，并显示
        String path = file.getPath();
        // 标签输出刚选择的路径
        srcDirectory.setText(path);
        // 文件扫描回调接口，保存下一级子文件夹和文件到数据库的操作
        ScanCallBack callBack = new FileSave2DB();
        FileScanner fileScanner = new FileScanner(callBack);
        // 1.choose方法执行结束标签才会显示内容，因此在进行该目录下的文件扫描我们需要新启动线程处理
        if (fileScanTask != null) {
            // 此时又点开新的任务，中断前一个任务扫描
            fileScanTask.interrupt();
        }
        fileScanTask = new Thread(() -> {
            fileScanner.scan(file);
            // 选择目录结束后刷新表格
            freshTable();
        });
        fileScanTask.start();
    }

    // 刷新表格数据
    private void freshTable(){
        ObservableList<FileMeta> metas = fileTable.getItems();
        metas.clear();
        // 根据选择的文件夹以及搜索框的内容去数据库查询数据刷新表格内容
        String dir = srcDirectory.getText();
        if (dir != null && dir.trim().length() != 0) {
            String content = searchField.getText();
            // 根据路径和搜索框的内容查询数据库信息，刷新表格
            List<FileMeta> result = FileSearch.search(dir,content);
            metas.addAll(result);
        }
        // javafx通过反射取出FileMeta的信息写入app.fxml表单中
    }

}
